package 剑指offer;

/**
 * @author: tyy 剑指 Offer
 *299. 猜数字游戏
 * 你在和朋友一起玩 猜数字（Bulls and Cows）游戏，该游戏规则如下：
    写出一个秘密数字，并请朋友猜这个数字是多少。朋友每猜测一次，你就会给他一个包含下述信息的提示：
    猜测数字中有多少位属于数字和确切位置都猜对了（称为 "Bulls", 公牛），
    有多少位属于数字猜对了但是位置不对（称为 "Cows", 奶牛）。也就是说，这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。
    给你一个秘密数字 secret 和朋友猜测的数字 guess ，请你返回对朋友这次猜测的提示。
    提示的格式为 "xAyB" ，x 是公牛个数， y 是奶牛个数，A 表示公牛，B 表示奶牛。
    请注意秘密数字和朋友猜测的数字都可能含有重复数字。
    输入: secret = "1807", guess = "7810"
    输出: "1A3B"
    解释: 数字和位置都对（公牛）用 '|' 连接，数字猜对位置不对（奶牛）的采用斜体加粗标识。
    "1807"
    |
    "7810"
 * @create: 2021-11-08 17:40
 * @description:
 **/
public class Solution19 {
    public String getHint(String secret, String guess) {
        int[] nums = new int[10];
        int countA = 0, countB = 0;
        for (int i = 0; i < secret.length(); i++) {
            if(secret.charAt(i) == guess.charAt(i)) countA++;
            else{
//                nums[guess.charAt(i) - '0'] = nums[guess.charAt(i) - '0'] - 1;
                if (nums[guess.charAt(i) - '0']-- > 0) {
                    countB++;
                }
//                nums[guess.charAt(i) - '0'] = nums[guess.charAt(i) - '0'] + 1;
                if(nums[secret.charAt(i) - '0']++ < 0) {
                    countB++;
                }
            }
        }
        return countA + "A" + countB + "B";
    }

    /**第一个for循环用两个数组分别统计数字的个数并对比,如果相同则公牛'a'+1,第二个for循环取数组中的数做对比取最小值,得出两个数一共有b个数相同,最后字符串拼接a'A'(b-a)'B'得到答案
     *  这道题就是做对比,位置相同数字相同就公牛+1,数字相同但位置不同就母牛+1
     *  @AroundZW 感谢你的解答！对于a是很好理解的，位置和数字都一样的就累加1即可！但是对于b就有点困惑：首先s[],g[]保存的是两个数中每一个数字出现的次数，那么对于同一个数字i来说，取这两者的较小者x就是数字i在这两个数中都至少出现了x次。哦哦写到这里就懂了，除了x次，剩余的那些次都是数字不相同的，可以直接不用考虑！多谢了
     *  @AroundZW 感谢解答！！两个数组用来记录两个字符串中共有的字符实在是太巧妙了！！
     * @param secret
     * @param guess
     * @return
     */
    public String getHint1(String secret, String guess) {
        StringBuilder sb = new StringBuilder();
        int a = 0, b = 0;
        int[] s = new int[10];
        int[] g = new int[10];
        for (int i = 0; i < secret.length(); i++) {
            s[secret.charAt(i) - '0']++;
            g[guess.charAt(i) - '0']++;
            a += secret.charAt(i) == guess.charAt(i) ? 1 : 0;
        }
        for (int i = 0; i < s.length; i++)
            b += Math.min(s[i], g[i]);
        return sb.append(a).append("A").append(b - a).append("B").toString();
    }
    public static void main(String[] args) {
        String secret = "1807";
        String guess = "7810";
        String number = new Solution19().getHint(secret, guess);
        System.out.println("number = " + number);

                

    }
}